package token

import (
	"time"

	"gitee.com/liuxiaowei123/vblog-1.1/app/user"
	"gitee.com/liuxiaowei123/vblog-1.1/exception"
	"github.com/rs/xid"
)

type Token struct {
	// 该Token是颁发哪个用户的
	UserId int `json:"user_id"`
	// 人的名称， user_name
	UserName string `json:"username" gorm:"column:username"`
	// 颁发给用户的访问令牌(用户需要携带Token来访问接口)
	AccessToken string `json:"access_token"`
	// 过期时间(2h), 单位是秒
	AccessTokenExpiredAt int `json:"access_token_expired_at"`
	// 刷新Token
	RefreshToken string `json:"refresh_token"`
	// 刷新Token过期时间(7d)
	RefreshTokenExpiredAt int `json:"refresh_token_expired_at"`
	// 创建时间
	CreatedAt int64 `json:"created_at"`
	// 更新实现
	UpdatedAt int64 `json:"updated_at"`
	// 额外补充信息, gorm忽略处理，也就是无需入库；只要返回的token中有此字段就可以
	Role user.Role `gorm:"-"`
}

func NewToken() *Token {
	return &Token{
		AccessToken:           xid.New().String(),
		AccessTokenExpiredAt:  7200,
		RefreshToken:          xid.New().String(),
		RefreshTokenExpiredAt: 7200 * 12 * 7,
		CreatedAt:             time.Now().Unix(),
	}
}

// 定义token过期时间
func (t *Token) Expiredtime() time.Time {
	return time.Unix(t.CreatedAt, 0).Add(time.Duration(t.AccessTokenExpiredAt) * time.Second)
}

// 判断token是否过期
func (t *Token) IsExpired() error {
	tm := time.Since(t.Expiredtime())
	expired := tm.Seconds()
	if expired > 0 {
		return exception.NewExpiredTime("token %s已经过期%f秒", t.AccessToken, expired)
	}
	return nil
}
